function cgamma(z) ! sikinote (http://slpr.sakura.ne.jp/qp) ! author : sikino ! date : 2017/01/09 ! 2017/01/10 optimize the number of a(M) ! 2017/10/27 fix for positive integer implicit none complex(kind(0d0)),intent(in)::z complex(kind(0d0))::cgamma integer::i,n,M double precision,parameter::pi=3.14159265358979324d0 double precision,parameter::e1=0.3678794411714423216d0 double precision,parameter::ln2pi2=0.91893853320467274d0 double precision,parameter::sq2pi=2.5066282746310005d0 double precision::a(1:30),AB(1:14),dz,iz complex(kind(0d0))::q,s,w,r,q1,q2 dz=dble(z) iz=imag(z) if(dz.eq.nint(dz).and.iz.eq.0d0)then if(dz.gt.0d0)then s=dcmplx(1d0,0d0) n=nint(dz) do i=2,n-1 s=s*i enddo else s=1d+300 endif cgamma=s else q=z if(dz.lt.0d0)q=1d0-z if(abs(iz).lt.1.45d0)then ! For x=arb, |y|\lt 1.45 n=int(dble(q)) s=1d0 do i=1,n s=s*(q-i) enddo w=q-dble(n) a(1) = 1d0 a(2) = 0.57721566490153286d0 a(3) =-0.65587807152025388d0 a(4) =-0.42002635034095236d-1 a(5) = 0.16653861138229149d0 a(6) =-0.42197734555544337d-1 a(7) =-0.96219715278769736d-2 a(8) = 0.72189432466630995d-2 a(9) =-0.11651675918590651d-2 a(10)=-0.21524167411495097d-3 a(11)= 0.12805028238811619d-3 a(12)=-0.20134854780788239d-4 a(13)=-0.12504934821426707d-5 a(14)= 0.11330272319816959d-5 a(15)=-0.20563384169776071d-6 a(16)= 0.61160951044814158d-8 a(17)= 0.50020076444692229d-8 a(18)=-0.11812745704870201d-8 a(19)= 0.10434267116911005d-9 a(20)= 0.77822634399050713d-11 a(21)=-0.36968056186422057d-11 a(22)= 0.51003702874544760d-12 a(23)=-0.20583260535665068d-13 a(24)=-0.53481225394230180d-14 a(25)= 0.12267786282382608d-14 a(26)=-0.11812593016974588d-15 a(27)= 0.11866922547516003d-17 a(28)= 0.14123806553180318d-17 a(29)=-0.22987456844353702d-18 a(30)= 0.17144063219273374d-19 M=int(11.3*abs(w)+13) if(M.gt.30)M=30 r=a(M) do i=M-1,1,-1 r=r*w+a(i) enddo cgamma=s/(r*w) else ! For x=arb, |y|\gt 1.45 s=1d0 if(abs(q).lt.9d0)then do i=0,7 s=s*(q+i) enddo s=1d0/s q=q+8d0 endif AB(1) = 0.83333333333333333d-1 AB(2) =-0.27777777777777778d-2 AB(3) = 0.79365079365079365d-3 AB(4) =-0.59523809523809524d-3 AB(5) = 0.84175084175084175d-3 AB(6) =-0.19175269175269175d-2 AB(7) = 0.64102564102564103d-2 AB(8) =-0.29550653594771242d-1 q1=1d0/q q2=q1*q1 r=AB(8) do i=7,1,-1 r=r*q2+AB(i) enddo cgamma=s*exp((q-0.5d0)*log(q)-q+ln2pi2+r*q1) endif if(dz.lt.0d0)cgamma=pi/(cgamma*sin(pi*z)) endif return end function cgamma